from __future__ import annotations

"""
配置改为统一 YAML 文件存储（项目根目录 config.yaml）
- 不再使用 QSettings，也不在代码中硬编码
- 保留与原先相同的接口：get_base_url / set_base_url，以减少对 UI 代码的影响
"""

from pathlib import Path
from typing import Any
import importlib

_yaml_cache = None  # type: ignore[assignment]


def _require_yaml():
    global _yaml_cache
    if _yaml_cache is not None:
        return _yaml_cache
    try:
        _yaml_cache = importlib.import_module("yaml")
        return _yaml_cache
    except Exception:
        raise RuntimeError("缺少依赖 PyYAML，请先安装：pip install pyyaml")


class AppConfig:
    """
    应用配置读写（YAML）
    - 默认路径：项目根目录下的 config.yaml
    - 示例结构：
      base_url: "https://example.com"
    """

    def __init__(self, path: str | None = None):
        # 计算默认的配置文件路径：.../project_root/config.yaml
        if path:
            self.path = Path(path).expanduser().resolve()
        else:
            # src/config.py -> src -> project_root
            project_root = Path(__file__).resolve().parents[1]
            self.path = project_root / "config.yaml"

        self._data: dict[str, Any] = {}
        self.load()  # 初始化时加载配置；不存在则创建默认文件

    # ---------------- 基础读写 ----------------

    def load(self) -> None:
        """从 YAML 文件读取配置；文件不存在则创建默认配置"""
        if self.path.exists():
            try:
                text = self.path.read_text(encoding="utf-8")
                ym = _require_yaml()
                data = ym.safe_load(text)
                self._data = data if isinstance(data, dict) else {}
            except Exception:
                # 读取或解析异常时，使用空配置，避免崩溃
                self._data = {}
        else:
            # 初始化默认配置并写入文件
            self._data = {"base_url": ""}
            self.save()

    def save(self) -> None:
        """将当前内存中的配置写回 YAML 文件"""
        self.path.parent.mkdir(parents=True, exist_ok=True)
        ym = _require_yaml()
        dump = ym.safe_dump(
            self._data,
            allow_unicode=True,
            sort_keys=True,
            indent=2,
        )
        self.path.write_text(dump, encoding="utf-8")

    # ---------------- 对外接口（保持与原代码一致） ----------------

    def get_base_url(self) -> str:
        """读取保存的 WordPress 站点基础地址，例如 https://example.com"""
        return str(self._data.get("base_url", "") or "")

    def set_base_url(self, url: str) -> None:
        """保存 WordPress 站点基础地址到 YAML 文件"""
        self._data["base_url"] = (url or "").strip()
        self.save()

    # ---------------- 测试账号功能 ----------------

    def get_test_account(self) -> dict[str, str]:
        """获取测试账号配置"""
        account = self._data.get("test_account", {})
        return {
            "username": account.get("username", ""),
            "password": account.get("password", "")
        }

    def set_test_account(self, username: str, password: str) -> None:
        """设置测试账号配置"""
        self._data["test_account"] = {
            "username": username.strip(),
            "password": password.strip()
        }
        self.save()